#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>

//***************************客户端***************************
//***************************UDP*****************************

//向服务器发送请求
//   发送内容从标准输入读取
//接收服务器的响应
//   将接收的响应显示到标准输出上

// ./client IP  Port
// 向哪个服务器发送请求
typedef struct sockaddr sockaddr;
typedef struct sockaddr_in sockaddr_in;
int main(int argc,char * argv[])
{

  if(argc!=3)
  {
    printf("Usage [IP] [Port]\n");
    exit(1);
  }
  //创建socket
  int fd=socket(AF_INET,SOCK_DGRAM,0);
  if(fd<0)
  {
    perror("socket");
  }
  //将要发送给哪个服务器的信息赋值sockaddr_in
  
  sockaddr_in service;
  service.sin_family=AF_INET;
  service.sin_addr.s_addr=inet_addr(argv[1]);
  //将端口号转换位网络字节序
  service.sin_port=htons(atoi(argv[2]));

  socklen_t service_len=sizeof(service);

  //从标准输入读取信息
  char buf[1024]={0};

  //**************接收服务器的响应************************
  while(1)
  {
    ssize_t read_size=read(0,buf,sizeof(buf)-1);
    if(read_size<0)
    {
      perror("read");
      return 1;
    }
    if(read_size==0)
    {
      //读取到文件结束
      printf("done\n");
    }
    buf[read_size]='\0';

    //***************将读取的内容发送给服务器****************
    int send_ret=sendto(fd,buf,read_size,0,(sockaddr *)&service, service_len);
    if(send_ret<0)
    {
      perror("send");
      return 1;
    }
    char service_buf[1024]={0};
    read_size=recvfrom(fd,service_buf,sizeof(service_buf)-1,0,NULL,NULL);
    if(read_size<0)
    {
      perror("recvfrom");
      return 1;
    }
    if(read_size==0)
    {
      printf("read done\n");
    }
    else
    {
      buf[read_size]='\0';
      printf("service response :%s",service_buf);
      fflush(stdout);
    }
  }
  close(fd);
}

